import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Timer;
import java.util.TimerTask;

/**
 * create by yongli on 2020-05-04 23:23
 * 从最简单的socket通信开始。
 * 服务端监听端口
 */

public class ServerMain {
    private static String subStr = "subscribe";

    public static void main2(String[] args) throws Exception {


        ServerSocket serverSocket = new ServerSocket(7070);
        while (true) {
            try {
                Socket socket = serverSocket.accept(); // 阻塞的等待请求
                Thread thread = new Thread(() -> process(socket));
                thread.start(); // 开启一个线程处理
                // 打印了请求，并没回应请求
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    // 这个方法是无转态的
    public static void process(Socket socket) {
        // 根据请求类型，如果是sub请求，就开启Timer模式，定时向其推送信息
        // 如果是其他的请求就直接返回
        try {
            InputStream input = socket.getInputStream();
            byte[] buf = new byte[1024];
            int off = 0;
            while ((off = input.read(buf)) != -1) {
                System.out.println("off：" + off);
                // new的String比较，是不是一个坑？
                // 为什么进不去？str为什么变成了1024？
                // String str = new String(buf, Charset.forName("UTF-8"));
                String str = new String(buf, 0, off);
                System.out.println(str);

                System.out.println("the length:" + str.length());
                if (str.equals(subStr)) {
                    System.out.println("enter in");
                    // 方法中创建对象，创建逻辑
                    TimerTask timerTask = new TimerTask() {
                        @Override
                        public void run() {
                            try {
                                System.out.println("start push");
                                // 使用了所在环境的变量
                                OutputStream out = socket.getOutputStream();
                                byte[] rep = "I have receive the infomation;".getBytes();
                                out.write(rep);
                                out.flush();
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    };
                    // 1s推送一次
                    Timer timer = new Timer();
                    timer.schedule(timerTask, 10, 1000);
                }
                break;
            }


            // 打印了请求，并没回应请求
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 这阻塞，当别的请求没有关闭时，其他的client请求会被refuse
    public static void block() throws Exception {
        System.out.println("I am the socket server!");
        // 监听7070端口

        ServerSocket serverSocket = new ServerSocket(7070);
        while (true) {
            try {
                Socket socket = serverSocket.accept(); // 阻塞的等待请求
                InputStream input = socket.getInputStream();
                byte[] buf = new byte[1024];
                int off = 0;
                System.out.println("start");
                // read方法会一直阻塞吗,什么时候会退出read方法呢？
                // 这时候应该和对方协商一下，什么时候结束
                // 如果不管，这个会一直读取。
                while ((off = input.read(buf)) != -1) {
                    System.out.println("off：" + off);
                    String str = new String(buf);
                    System.out.println(str);
                    break;
                }
                System.out.println("read over");
                OutputStream out = socket.getOutputStream();
                byte[] rep = "I have receive the infomation;".getBytes();
                out.write(rep);
                out.flush();

                System.out.println("end");

                // 打印了请求，并没回应请求
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
